package com.example.teach.utils;

import io.jsonwebtoken.*;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    //令牌有效期
    private static final long TOKEN_EXPIRE_TIME = 60 * 60 * 24 * 7;
    //密钥
    private static final String JWT_SECRET = "mysecretkey1234567890qwertyuiopasdfghjklzxc";

    /**
     * 生成JWT令牌
     * @param
     * @param userName 用户名
     * @param userType 用户类型
     * @return 令牌字符串
     */
    public static String generateToken(Integer userId, String userName,Integer userType){
        Date expireDate = new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME);
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId",userId);
        claims.put("userName",userName);
        claims.put("userType",userType);

        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(expireDate)
                .signWith(getSecretKey(),SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 验证令牌是否有效
     * @param token 令牌
     * @return 是否有效
     */
    public static boolean validateToken(String token){
        try{
            Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())
                    .build()
                    .parseClaimsJws(token);
            return true;
        }catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e){
            return false;
        }
    }

    /**
     * 从令牌中获取用户ID
     * @param token 令牌
     * @return 用户名
     */
    public static Integer getUserIdFromToken(String token){
        Claims claims = getClaimsFromToken(token);
        return claims.get("userId",Integer.class);
    }

    /**
     * 从令牌中获取用户名
     * @param token 令牌
     * @return 用户名
     */
    public static String getUsernameFromToken(String token){
        Claims claims = getClaimsFromToken(token);
        return claims.get("userName",String.class);
    }

    /**
     * 从令牌中获取用户类型
     * @param token 令牌
     * @return 用户名
     */
    public static Integer getUserTypeFromToken(String token){
        Claims claims = getClaimsFromToken(token);
        return claims.get("userType",Integer.class);
    }

    /**
     * 从令牌中获取数据声明
     * @param token 令牌
     * @return 数据声明
     */
    private static Claims getClaimsFromToken(String token){
        return Jwts.parserBuilder()
                .setSigningKey(getSecretKey())
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 获取密钥
     * @return 密钥
     */
    private static SecretKey getSecretKey(){
        // 直接使用原始密钥的字节数组，无需Base64解码
        byte[] keyBytes = JWT_SECRET.getBytes(StandardCharsets.UTF_8);
        // 确保密钥长度符合HS256要求（至少256位=32字节），不足则填充
        if (keyBytes.length < 32) {
            byte[] newKey = new byte[32];
            System.arraycopy(keyBytes, 0, newKey, 0, keyBytes.length);
            keyBytes = newKey;
        }
        return new SecretKeySpec(keyBytes, SignatureAlgorithm.HS256.getJcaName());
    }
}
